#ifndef _WX_ACCEL_H_BASE_
#define _WX_ACCEL_H_BASE_

#include "wx/defs.h"
#include "wx/object.h"

class wxAcceleratorTable;
class wxMenuItem;
class wxKeyEvent;

enum {
  wxACCEL_NORMAL  = 0x0000,   // no modifiers
  wxACCEL_ALT     = 0x0001,   // hold Alt key down
  wxACCEL_CTRL    = 0x0002,   // hold Ctrl key down
  wxACCEL_SHIFT   = 0x0004,   // hold Shift key down
  #if defined(__WXMAC__) || defined(__WXCOCOA__)
  wxACCEL_CMD      = 0x0008   // Command key on OS X
  #else
  wxACCEL_CMD      = wxACCEL_CTRL
  #endif
};

class wxAcceleratorEntry {
  public:
    wxAcceleratorEntry( int flags = 0, int keyCode = 0, int cmd = 0,
                        wxMenuItem *item = NULL )
      : m_flags( flags )
      , m_keyCode( keyCode )
      , m_command( cmd )
      , m_item( item ) { }

    wxAcceleratorEntry( const wxAcceleratorEntry& entry )
      : m_flags( entry.m_flags )
      , m_keyCode( entry.m_keyCode )
      , m_command( entry.m_command )
      , m_item( entry.m_item ) { }
    static wxAcceleratorEntry *Create( const wxString& str );

    wxAcceleratorEntry& operator=( const wxAcceleratorEntry& entry ) {
      Set( entry.m_flags, entry.m_keyCode, entry.m_command, entry.m_item );
      return *this;
    }

    void Set( int flags, int keyCode, int cmd, wxMenuItem *item = NULL ) {
      m_flags = flags;
      m_keyCode = keyCode;
      m_command = cmd;
      m_item = item;
    }

    void SetMenuItem( wxMenuItem *item ) { m_item = item; }

    int GetFlags() const { return m_flags; }
    int GetKeyCode() const { return m_keyCode; }
    int GetCommand() const { return m_command; }

    wxMenuItem *GetMenuItem() const { return m_item; }

    bool operator==( const wxAcceleratorEntry& entry ) const {
      return m_flags == entry.m_flags &&
             m_keyCode == entry.m_keyCode &&
             m_command == entry.m_command &&
             m_item == entry.m_item;
    }

    bool operator!=( const wxAcceleratorEntry& entry ) const{ return !( *this == entry ); }
    bool IsOk() const {
      return m_keyCode != 0;
    }

    wxString ToString() const;
    bool FromString( const wxString& str );
  private:
    static bool ParseAccel( const wxString& str, int *flags, int *keycode );
    int m_flags;    // combination of wxACCEL_XXX constants
    int m_keyCode;  // ASCII or virtual keycode
    int m_command;  // Command id to generate

    // the menu item this entry corresponds to, may be NULL
    wxMenuItem *m_item;

    // for compatibility with old code, use accessors now!
    friend class wxMenu;
};

#if defined(__WXUNIVERSAL__)
#error mmm
#include "wx/generic/accel.h"
#elif defined(__WXMOTIF__)
#include "wx/motif/accel.h"
#elif defined(__WXGTK20__)
//#error mmm
#include "wx/gtk/accel.h"
#elif defined(__WXGTK__)
#error mmm
#include "wx/gtk1/accel.h"
#elif defined(__WXMAC__)
#include "wx/mac/accel.h"
#elif defined(__WXCOCOA__)
#include "wx/generic/accel.h"
#elif defined(__WXPM__)
#include "wx/os2/accel.h"
#endif

extern wxAcceleratorTable wxNullAcceleratorTable;

#endif
